#include "LinearPiecewise.h"
#include "stdio.h"

void lin_sort(Linear_t *lin);
int lin_search_list(Linear_t *lin, float x);


void lin_test()
{
//    Linear_t linear;
//    Linear_t linear2;

//    lin_clear(&linear);
//    lin_clear(&linear2);
//    lin_add_row(&linear,1,100);
//    lin_add_row(&linear,3,300);
//    lin_add_row(&linear,5,600);
//    lin_add_row(&linear,7,1000);
//    lin_add_row(&linear2,100,120);
//    lin_add_row(&linear2,300,350);
//    lin_add_row(&linear2,600,800);
//    lin_add_row(&linear2,1000,2000);
//    
//    for(int i = 0; i < 100; i++)
//    {
//        float y1 = lin_get(&linear, i/10.0);
//        float y2 = lin_get(&linear2, y1);
//        printf("[%d]index:\t%0.3f\t %0.3f\n",i/10,y1, y2);
//    }
//    
//    
//    
//    for(int i = -20; i < 40; i++)
//    {
//        float y1 = lin_get(&config.lin[1], i/100.0);
//        float y2 = lin_get(&config.lin[0], y1);
//        printf("[%f]index:\t%0.3f\t %0.3f\n",i/100.0,y1, y2);
//    }
    return;
}
int lin_add_row(Linear_t *lin, float x,float y)
{
    if(lin->rows >= CALI_PAIR_MAX)
    {
        return -1;
    }
    lin->pair[lin->rows].x = x;
    lin->pair[lin->rows].y = y;   
    lin->rows++;
    return 0;
}
int lin_get_rows(Linear_t *lin)
{
    return lin->rows;
}
int lin_clear(Linear_t *lin)
{
    lin->rows = 0;
    return 0;
}
//int lin_clear(Linear_t *lin)
//{
//    lin->rows = 0;
//    return 0;
//}
//index 0到max递增，第一次出现x > table[index]的情况，index+1就是返回值
int lin_search_list(Linear_t *lin, float x)
{
    int lower = 0 ;
    int upper = lin->rows - 1;
    int mid = (lower + upper) / 2 ;

    do
    {
	float val = lin->pair[mid].x ;
		
	if (val == x)
	{
	    break;
	}
	else if (val < x)
	{
	    lower = mid + 1 ;
	}
	else
	{
	    upper = mid ;
	}
		
	mid = (lower + upper) / 2 ;
		
    } while (lower < upper)	;
	// falls through on last mismatch

    return(mid);
}

float lin_get(Linear_t *lin,float x)
{
    float x_upper, x_lower ;
    float predictive = 0 ; 		
    float y ;

    int index = lin_search_list(lin,x) ;
	
    if(index == 0)
    {
        index = 1;
    }    
    //寻找到x的下界和上界。
    x_lower = lin->pair[index - 1].x ;
    x_upper = lin->pair[index].x;
    float percent = (x - x_lower) / (x_upper - x_lower);
    // 评估值thousandth= （上界y-下界y） * （x在上界x和下届x的比例）
    predictive = (lin->pair[index].y - lin->pair[index - 1].y)  *  percent;

    y  = lin->pair[index - 1].y + predictive ;
    return(y);
}

#include "sort.h"


void lin_sort(Linear_t *lin)
{
    
    float x[CALI_PAIR_MAX],y[CALI_PAIR_MAX];
    for(int i = 0; i < lin->rows; i++)
    {
        x[i] = lin->pair[i].x;
    }
//    for(int i = 0; i < lin->rows; i++)
//    {
//        printf("x:[%0.9f\t %0.3f]\n",x[i], lin->pair[i].y);
//    }
    quick_sort(x,0,lin->rows-1);
    for(int i = 0; i < lin->rows; i++)
    {
        for(int j = 0; j < lin->rows; j++)
        {
            if(x[i] == lin->pair[j].x)
            {
                y[i] = lin->pair[j].y;
                break;
            }
        }
    }
    for(int i = 0; i < lin->rows; i++)
    {
        lin->pair[i].x = x[i];
        lin->pair[i].y = y[i];
//        printf("xy:[%0.9f\t %0.3f]\n",x[i], y[i]);
    }
}

void lin_print(Linear_t *lin)
{
    for(int i = 0; i < lin->rows; i++)
    {
        Serial.printf("x:%0.6f\ty:%0.6f\n",lin->pair[i].x, lin->pair[i].y);
    }
}